// 版权所有2016 etcd作者
// 
// 根据Apache许可证2.0版（以下简称“许可证”）获得许可；
// 除非遵守许可证，否则不得使用此文件。
// 您可以通过
// 
// www.apache.org/licenses/LICENSE-2.0 
// 
// 除非适用法律要求或书面同意，否则根据许可证分发的软件
// 按“原样”分发，
// 无任何明示或暗示的保证或条件。
// 请参阅许可证，了解管理许可的特定语言和
// 许可证下的限制。

package clientv3

import (
	pb "go.etcd.io/etcd/api/v3/etcdserverpb"
)

// CompactOp表示压缩操作。
type CompactOp struct {
	revision int64
	physical bool
}

// CompactOption配置压缩操作。
type CompactOption func(*CompactOp)

func (op *CompactOp) applyCompactOpts(opts []CompactOption) {
	for _, opt := range opts {
		opt(op)
	}
}

// OpCompact包装切片CompactOption以创建一个CompactOp。
func OpCompact(rev int64, opts ...CompactOption) CompactOp {
	ret := CompactOp{revision: rev}
	ret.applyCompactOpts(opts)
	return ret
}

func (op CompactOp) toRequest() *pb.CompactionRequest {
	return &pb.CompactionRequest{Revision: op.revision, Physical: op.physical}
}

// WithCompactPhysical使压缩等待，直到从etcd服务器的存储中删除所有压缩的条目。
func WithCompactPhysical() CompactOption {
	return func(op *CompactOp) { op.physical = true }
}
